package com.ccp.dev.im.service;

import com.alibaba.fastjson.JSONObject;
import com.ccp.dev.core.basic.base.BaseService;
import com.ccp.dev.core.util.StringUtil;
import com.ccp.dev.im.dao.ImUserDao;
import com.ccp.dev.im.model.ImRoom;
import com.ccp.dev.im.model.ImUser;
import com.ccp.dev.im.server.connertor.ImConnertor;
import com.ccp.dev.im.server.constant.Constants;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 在线聊天用户 信息操作服务类
 *
 * @author y
 * @date 2020-02-17 11:39:36
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class ImUserService extends BaseService<ImUser> {

    @Resource
    private ImUserDao dao;

    /**
     * 群聊添加人员
     */
    public static final String TYPE_ADD_LIST = "1";

    /**
     * 群聊删除人员
     */
    public static final String TYPE_DEL_LIST = "2";

    /**
     * 创建群聊成员列表
     */
    public static final String TYPE_CREATE_LIST = "3";

    @Resource
    private ImRoomUserService imRoomUserService;

    @Resource
    private ImRoomService imRoomService;

    @Resource
    private ImConnertor imConnertorImpl;

    /**
     * 根据平台用户得id获取数据 1对1得关系
     *
     * @param userId 用户id
     * @return 用户数据
     */
    public ImUser getByUserId(String userId) {
        return dao.getByUserId(userId);
    }

    /**
     * 添加群聊人员；删除群聊人员；创建群聊，树的成员列表
     *
     * @param imUserList 所有成员
     * @param type       操作的业务
     * @param roomId     群ID
     * @param currentImUserId     当前用户ID
     * @return
     */
    public List<ImUser> getCurrentTreeUserList(List<ImUser> imUserList, String type, String roomId, String currentImUserId) {
        if (StringUtil.isEmpty(type)) {
            return imUserList;
        }
        List<ImUser> retUserList = new ArrayList<>();
        if (StringUtil.isNotEmpty(roomId)) {
            Set<String> roomUserSet = imRoomUserService.getRoomUserIdsByRoomId(roomId);
            //如果是群聊的添加人员列表，需要把imUserList里面的人员过滤掉已经是这个群组的人员
            if (type.equals(TYPE_ADD_LIST)) {
                for (ImUser item : imUserList) {
                    if (!roomUserSet.contains(item.getId())) {
                        retUserList.add(item);
                    }
                }
                //删除人员 列表只能是改群聊下的成员
            } else if (type.equals(TYPE_DEL_LIST)) {
                ImRoom iRoom = imRoomService.getOneById(roomId);
                String roomOwnerId = iRoom.getUserId();
                for (ImUser item : imUserList) {
                    if (roomUserSet.contains(item.getId()) && !roomOwnerId.equals(item.getId())) {
                        retUserList.add(item);
                    }
                }
            }
        } else if (type.equals(TYPE_CREATE_LIST))
            //创建群聊 人员列表去掉当前登录人
        {
            for (ImUser item : imUserList) {
                if (!currentImUserId.equals(item.getId())) {
                    retUserList.add(item);
                }
            }
        }
        return retUserList;
    }


    /**
     * 修改用户昵称,头像等信息
     *
     * @param imUser 用户对象
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateUserInfo(ImUser imUser) {
        dao.update(imUser);
        //给其好友推送信息 以同步好友面板中的该用户的信息 查询im_user表所有用户
        Set<String> userIds = dao.getAllUserIds();
        userIds.remove(imUser.getId());
        String[] ids =  userIds.toArray(new String[]{});
        imConnertorImpl.pushSystemMessage(JSONObject.toJSONString(imUser), Constants.SystemMsgType.UPDATE_USER_INFO, ids);
    }
}
